package ipdesk.model.notice.dao;


import ipdesk.model.notice.bean.NoticeBean;
import ipdesk.model.report.promote.bean.PromoteInfoBean;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.ibatis.dao.client.DaoManager;
import com.opensymphony.xwork2.ActionSupport;

import ecg.dao.DaoService;
import ecg.util.FileService;

public class NoticeDao extends ActionSupport
{
	private static NoticeDao singleton;
	
	protected NoticeDao(){}
	
	public static NoticeDao getInstance()
	{
		if(singleton == null)
		{
			singleton = new NoticeDao();
		}
		
		return singleton;
	}
	
	private DaoManager	manager	= DaoService.getInstance();
	private INotice notice 	= (INotice)manager.getDao(INotice.class, "ip_desk");
	
	
	public int getDataTotalCount(NoticeBean noticeBean) throws Exception
	{
		int totalDataCount = notice.getDataTotalCount(noticeBean);
		
		return totalDataCount;
	}
	
	
	/**
	 * 입력받은 데이터를 DB에 insert 하는 메서드.
	 */
	public int noticeReg(NoticeBean noticeBean) throws Exception
	{
		int lastNoticeSeq = 0;
		
		try{
			// 트랜잭션 시작
			manager.startTransaction();
			
			// 상담정보 insert.
			lastNoticeSeq = notice.noticeReg(noticeBean);
			
			manager.commitTransaction();
		}finally{
			manager.endTransaction();
		}
		
		return lastNoticeSeq;
	}
	
	/**
	 * 파일데이터 DB에 insert.
	 * @param noticeBean
	 * @throws Exception
	 */
	public void insertFileData(NoticeBean noticeBean) throws Exception
	{
				
		try{
			manager.startTransaction();
			
			notice.insertFileData(noticeBean);
			
			manager.commitTransaction();
		}finally{
			manager.endTransaction();
		}								
	}
	
	/**
	 *  공지사항 목록 데이터를 가지고 온다. 
	 * @param map
	 * @return
	 */
	public List<NoticeBean> getPagingDataList(Map map)
	{
		List<NoticeBean> pageDataList = notice.getPagingDataList(map);
		
		// 등록일 자르기.
		for(int i=0; i < pageDataList.size(); i++)
		{
			String writeTime = pageDataList.get(i).getWriteTime().substring(0,10);
			
			pageDataList.get(i).setWriteTime(writeTime);
		}
		
		return pageDataList;
	}
	
	/**
	 * 조회수 업데이트
	 */
	public void updateReadCount(int noticeSeq)
	{
		notice.updateReadCount(noticeSeq, "notice.updateReadCount");
	}
	
	
	/**
	 *  해당 noticeSeq에 대한 데이터를 가지고 온다.
	 *
	 */
	public NoticeBean getModifyData(int noticeSeq)
	{
		NoticeBean noticeBean = notice.getDataOneRow(noticeSeq, "notice.noticeDetailData");
		
				
		return noticeBean;
	}
	
	
	/**
	 *  해당 noticeSeq에 대한 데이터를 가지고 온다.
	 *
	 */
	public NoticeBean getDetailData(int  noticeSeq)
	{
		NoticeBean noticeBean = notice.getDataOneRow( noticeSeq, "notice.noticeDetailData");
		
		// 시간 잘라내기
		String writeTime = noticeBean.getWriteTime();
		
		if(writeTime != null)
		{
			writeTime = noticeBean.getWriteTime().substring(0, 10);
			
			// 변환된 스트링을 다시 빈에 저장.
			noticeBean.setWriteTime(writeTime);
		}
		
		String content = noticeBean.getContent().replace("\n", "<br/>");
		noticeBean.setContent(content);
		
		return noticeBean;
	}
	
	
	/**
	 *  해당 noticeSeq에 대한 데이터를 삭제한다.
	 *
	 */
	public void deleteDataOneRow(int noticeSeq)
	{
		notice.deleteDataOneRow(noticeSeq, "notice.deleteUploadData");
	}
	
	
	/**
	 *  해당 noticeSeq에 대한 파일데이터를 가지고 온다.
	 *
	 */
	public NoticeBean getUploadData(int noticeSeq)
	{
		NoticeBean noticeBean = notice.getDataOneRow(noticeSeq, "notice.noticeUploadData");
				
		return noticeBean;
	}
	
	
	/**
	 *  해당 ConsultingSeq에 대한 데이터를 업데이트 한다.
	 */
	public int noticeUpdate(NoticeBean noticeBean) throws Exception
	{
		
		int result = 0;
		
		try{
			manager.startTransaction();
			
			// 공지사항 업데이트.
			result = notice.noticeUpdate(noticeBean, "notice.updateNoticeData");
			
			if(result != 0 && noticeBean.getUpload() != null)
			{
				this.insertFileData(noticeBean);
			}
			manager.commitTransaction();
			
		}finally{
			manager.endTransaction();
		}
		
		
		return result;
	}
	
	
	/**
	 * 파일 삭제
	 */
	public boolean fileDelete(int noticeSeq)
	{
		boolean deleteFlag = false;
		
		// promoteSeql에 해당하는 파일 데이터를 가지고 온다.
		NoticeBean noticeBean = notice.getDataOneRow(noticeSeq, "notice.noticeUploadData");
		
		// 데이터가 존재한다면 데이터 삭제. 파일 삭제
		if(noticeBean != null)
		{
			try{
				manager.startTransaction();
				// 파일 데이터 삭제
				notice.deleteDataOneRow(noticeSeq, "notice.deleteUploadData");
				manager.commitTransaction();
				
				String filePathPrefix = getText("path.upload.prefix");
				String filePath = filePathPrefix + noticeBean.getPathName() + noticeBean.getUploadFileName();
				// 파일 삭제
				FileService fs = new FileService();
				fs.deleteFile(filePath);
				
				deleteFlag = true;
			}finally{
				manager.endTransaction();
			}
		}
		
		return deleteFlag;
	}
	
	/**
	 * 데이터 삭제
	 * 
	 */
	public boolean noticeDelete(int noticeSeq)
	{
		
		boolean fileDeleteFlag = false; 
		boolean deleteFlag = false;
		
		try{
			manager.startTransaction();
			// 파일 테이블 로우 및 파일 데이터 삭제.
			fileDeleteFlag = this.fileDelete(noticeSeq);
			
			// consult 데이터 삭제.
			notice.deleteDataOneRow(noticeSeq, "notice.deleteNoticeData");
				
			deleteFlag = true;
			
			manager.commitTransaction();
		}finally{
			manager.endTransaction();
		}
		
		return deleteFlag;
	}
}
